import { cloneDeep } from '@/utils'
import formatRules from './format-rules'
import { DEFAULT, ItemRenderDefaultValueMap } from './default-value'

/**
 *
 * @param {*} val options
 * @returns { data, rules, items,slotNames }
 */
export const initOptions = function (val) {
  const options = cloneDeep(val)

  let { rules = {} } = options

  let data = {}

  let items = []

  const slotNames = []
  const setItems = (cloneItems) => {
    return cloneItems.map((item) => {
      rules = Object.assign(rules, formatRules(item))

      if (item.slots) {
        if (item.slots.default) {
          slotNames.push(item.slots.default)
        } else if (item.slots.title) {
          slotNames.push(item.slots.title)
        }
      }
      // itemRender 添加 props 属性，以完成初始化渲染
      if (item.itemRender && !item.itemRender.props) {
        item.itemRender.props = {}
      } else if (!item.itemRender) {
        item.itemRender = {}
        item.itemRender.props = {}
      }

      if (typeof item.itemRender.props.clearable == 'undefined') {
        item.itemRender.props.clearable = true
      }

      if (item.field) {
        let MapVal

        if (
          Object.keys(ItemRenderDefaultValueMap).includes(item.itemRender.name)
        ) {
          // 如果 item.itemRender.defaultValue 存在且不是 undefined, null, ""
          if (
            typeof item.itemRender.defaultValue !== 'undefined' &&
            item.itemRender.defaultValue !== null &&
            item.itemRender.defaultValue !== ''
          ) {
            MapVal = item.itemRender.defaultValue
          } else {
            MapVal = ItemRenderDefaultValueMap[item.itemRender.name]
          }
        } else {
          // 如果 item.itemRender.defaultValue 存在且不是 undefined, null, ""
          if (
            typeof item.itemRender.defaultValue !== 'undefined' &&
            item.itemRender.defaultValue !== null &&
            item.itemRender.defaultValue !== ''
          ) {
            MapVal = item.itemRender.defaultValue
          } else {
            MapVal = DEFAULT
          }
        }

        // 如果data没传入值，则使用默认值
        if ([undefined, null, ''].includes(data[item.field])) {
          data[item.field] = MapVal
        }

        if (!item.resetValue) {
          // 如果没有传递resetValue 属性
          item.resetValue = () => MapVal
        }
      }

      if (item.children && item.children.length > 0) {
        return {
          ...item,
          children: setItems(item.children)
        }
      } else {
        return item
      }
    })
  }
  items = setItems(options.items)

  return {
    rules,
    data,
    items,
    slotNames
  }
}
